package com.thrm.servicios;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.thrm.dao.CandidatosDAO;
import com.thrm.dao.InscripcionDAO;
import com.thrm.domain.Candidato;
import com.thrm.domain.Curriculum;
import com.thrm.domain.Empresa;
import com.thrm.domain.Experiencia;
import com.thrm.domain.Inscripcion;
import com.thrm.domain.Oferta;

public class CandidatosServicios {

	private Candidato candidato = null;
	private List<Candidato> candidatos = null;
	private CandidatosDAO candidatoDAO = null;
	private InscripcionDAO inscripcionDAO = null;
	private ServiciosGlobales serviciosGlobales;
	private EmpresaServicios empresaServicios;

	private CandidatosServicios() {
		candidatoDAO = new CandidatosDAO();
		inscripcionDAO = new InscripcionDAO();
	}

	public Candidato buscarCandidatoPorId(long id) {
		Key key = KeyFactory.createKey("Candidato", id);
		return buscarCandidatoPorKey(key);
	}
	
	public Candidato getGenericCandidatoById(long id) {
		Empresa empresa = getEmpresaServicios().buscarEmpresaPorCif("0000000");
		Key key = empresa.getKey().getChild("Candidato", id);
		return buscarCandidatoPorKey(key);
	}
	
	public List<Candidato> buscarCandidatosInscritos(Oferta oferta) {
		
		List<Candidato> candidatos = null;
		if (oferta != null) {
			Set<Inscripcion> inscripciones = oferta.getInscripciones();
			candidatos = new ArrayList<>();
			for (Inscripcion inscripcion : inscripciones) {
				if (!(inscripcion.getEstado().equals("Eliminada"))) {
					Key candidatoKey = oferta.getEmpresa().getKey().getChild("Candidato", inscripcion.getCandidatoId());
					Candidato candidato = buscarCandidatoPorKey(candidatoKey);
					if(candidato!=null)
						candidatos.add(candidato);
					else {
						Empresa empresa = getEmpresaServicios().buscarEmpresaPorCif("0000000");
						Key key = empresa.getKey().getChild("Candidato", inscripcion.getCandidatoId());
						candidato = buscarCandidatoPorKey(key);
						if(candidato!=null)
							candidatos.add(candidato);
					}
				}
			}
		}
		return candidatos;
	}
	
	public Candidato buscarCandidatoPorKey(Key key) {
		return candidatoDAO.findByKey(key);
	}

	public Candidato buscarCandidatoPorDni(String dni) {
		Candidato candidato = null;
		candidatos = candidatoDAO.findByDni(dni);
		if (candidatos.size() >= 1) {
			candidato = candidatos.get(0);
		}
		return candidato;
	}
//
//	public Candidato buscarCandidatoPorEmail(String email) {
//		Candidato candidato = null;
//		candidatos = candidatoDAO.findByEmail(email);
//		if (candidatos.size() >= 1) {
//			candidato = candidatos.get(0);
//		}
//		return candidato;
//	}
//
	/**
	 * Comprueba la existencia del email y dni en la tabla candidatos
	 * Devolviendo true en caso de que exista
	 */
	public boolean verificarExistenciaDniEmail(String dni, String email) {
		boolean resultado = true;
		candidatos = candidatoDAO.findByDni(dni);
		if (candidatos.size() == 0) {
			candidatos = candidatoDAO.findByEmail(email);
		}
		if (candidatos.size() == 0) {
			resultado = false;
		}
		return resultado;
	}

	public List<Candidato> mostrarCandidatos() {
		candidatos = candidatoDAO.findAll();
		return candidatos;
	}
	
//	public List<Candidato> ultimosCandidatos() {
//		candidatos = candidatoDAO.findLastFive();
//		return candidatos;
//	}

	public String eliminarCandidato(String dni) {
		String resultado = "ERROR";
		candidatos = candidatoDAO.findByDni(dni);
		if (candidatos.size() == 1) {
			Candidato candidato = candidatos.get(0);
			candidatoDAO.delete(candidato);
			resultado = "SUCCESS";
		}
		return resultado;
	}

	public List<Inscripcion> getInscripciones(Candidato candidato) {
//		Set<Inscripcion> inscripciones = candidato.getInscripciones();
		
		List<Inscripcion> inscripciones = inscripcionDAO.findByProperty("candidatoId", candidato.getKey().getId());
		
		return inscripciones;
	}

//	public Set<Formacion> getFormacion(Candidato candidato) {
//		Set<Formacion> formaciones = candidato.getformaciones();
//		return formaciones;
//	}

	public String registrar(Candidato candidato) {
		String resultado = "ERROR";
		candidatoDAO.save(candidato);
		resultado = "SUCCESS";
		return resultado;
	}

	public String modificarDatosPersonales(Candidato candidato) {
		String resultado = "ERROR";
		Candidato candidatoAlmacenado = getServiciosGlobales().cargarCandidato();
		// Candidato
		// candidatoAlmacenado=this.buscarCandidatoPorDni(candidato.getDni());

		String password = candidatoAlmacenado.getPassword();
		candidato.setKey(candidatoAlmacenado.getKey());;
		candidato.setPassword(password);
		candidato.setFoto(candidatoAlmacenado.getFoto());
		
		candidatoDAO.merge(candidato);
		resultado = "SUCCESS";
		return resultado;
	}

	private ServiciosGlobales getServiciosGlobales() {
		return serviciosGlobales;
	}

	public String cambiarPassword(Candidato candidato, String nuevaPassword) {
		String resultado = "ERROR";
		candidato.setPassword(nuevaPassword);
//		candidatoDAO.attachDirty(candidato);
		candidatoDAO.merge(candidato);
		resultado = "SUCCESS";
		return resultado;
	}

	public String guardarFoto(Candidato candidato, String contenidoFoto) {
		String resultado = "ERROR";
		candidato.setFoto(getServiciosGlobales().stringToBlob(contenidoFoto));
		candidatoDAO.merge(candidato);
		resultado = "SUCCESS";
		return resultado;
	}

	public String eliminarFoto(Candidato candidato) {
		String resultado = "ERROR";
		candidato.setFoto(null);
		candidatoDAO.merge(candidato);
		resultado = "SUCCESS";
		return resultado;
	}

	public void setServiciosGlobales(ServiciosGlobales serviciosGlobales) {
		this.serviciosGlobales = serviciosGlobales;
	}

	public EmpresaServicios getEmpresaServicios() {
		return empresaServicios;
	}

	public void setEmpresaServicios(EmpresaServicios empresaServicios) {
		this.empresaServicios = empresaServicios;
	}

	public void merge(Candidato candidato) {
		candidatoDAO.merge(candidato);
	}

//	public String subirFoto() {
//		String resultado = "ERROR";
//		/*
//		 * final Logger logger = Logger.getLogger(ActionCandidato.class);
//		 * FileUpload fu=new FileUpload() { public String execute() {
//		 * System.out.println("Se va a ejecutar esto"); File uploadedFile =
//		 * this.getUpload(); String contentType = this.getUploadContentType();
//		 * String fileName = this.getUploadFileName();
//		 * System.out.println(fileName + contentType + uploadedFile.toString());
//		 * candidato.setFoto(fileName); candidatoDAO.save(candidato); return SUCCESS; } };
//		 * resultado=fu.execute();
//		 */
//		return resultado;
//
//	}
}